{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.定义F1评价指标\n",
    "该指标将在后面参与参数的选择<br/>\n",
    "$$ F1=\\frac{2*Precision*Recall}{Precision+Recall} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def F1(predictions, y):\n",
    "    TP = np.sum((predictions == 1) & (y == 1))\n",
    "    FP = np.sum((predictions == 1) & (y == 0))\n",
    "    FN = np.sum((predictions == 0) & (y == 1))\n",
    "    if TP + FP == 0:\n",
    "        precision = 0\n",
    "    else:\n",
    "        precision = float(TP) / (TP + FP)\n",
    "    if TP + FN == 0:\n",
    "        recall = 0\n",
    "    else:\n",
    "        recall = float(TP) / (TP + FN)\n",
    "    if precision + recall == 0:\n",
    "        return 0\n",
    "    else:\n",
    "        return (2.0 * precision * recall) / (precision + recall)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  2.定义普通高斯函数\n",
    "高斯分布的密度函数：$$ p(x;\\mu, \\sigma^2) = \\frac{1}{\\sqrt{2\\pi}\\sigma}exp(-\\frac{(x-\\mu)^2}{2\\sigma^2}) $$\n",
    "函数模型 $ p(x) $ 为：$$ p(x) = p(x_1;\\mu_1,\\sigma_1^2) \\times p(x_2;\\mu_2,\\sigma_2^2) \\times  ... \\times  p(x_n;\\mu_n,\\sigma_n^2) $$<br/>\n",
    "其中 $ x_i,i=1,2,...,n $ 是样本的特征，需对每个样本求其高斯分布密度函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gaussianModel(X):\n",
    "    # 参数估计\n",
    "    m, n = X.shape\n",
    "    mu = np.mean(X, axis=0) # 1*n维\n",
    "    sigma2 = np.var(X, axis=0) # 1*n维,是sigma的平方\n",
    "    \n",
    "    def p(x):\n",
    "        # x是单个样本，n*1维\n",
    "        total = 1\n",
    "        for j in range(x.shape[0]):\n",
    "            total *= np.exp(-np.power((x[j,0] - mu[0,j]), 2) / (2 * sigma2[0,j])) / (np.sqrt(2*np.pi*sigma2[0,j]))\n",
    "        return total\n",
    "    return p"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 定义多元高斯函数\n",
    "多元高斯分布的密度函数： $$ p(x;\\mu,\\Sigma) = \\frac{1}{(2\\pi)^{\\frac{n}{2}}{\\mid \\Sigma \\mid}^{\\frac{1}{2}}} exp (-\\frac{1}{2}(x-\\mu)^T \\Sigma^{-1} (x-\\mu)) $$ "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "def multivariateGaussianModel(X):\n",
    "    # 参数估计\n",
    "    m, n = X.shape\n",
    "    mu = np.mean(X.T, axis = 1) # n*1维\n",
    "    Sigma = np.mat(np.cov(X.T)) # n*n维\n",
    "    # 计算sigma的行列式\n",
    "    detSigma = np.linalg.det(Sigma)\n",
    "    \n",
    "    def p(x): # x为单个样本，n*1维\n",
    "        x = x - mu\n",
    "        return np.exp(-x.T * np.linalg.pinv(Sigma) * x/2).A[0] / (np.power((2*np.pi),n/2)*np.power(Sigma,1/2))\n",
    "    return p\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 定义训练函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(X, model=gaussianModel):\n",
    "    return model(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 定义参数 $ \\epsilon $ 选择函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "def selectEpsilon(XVal, yVal, p):\n",
    "    # 利用交叉验证集，以及F1来选取合适的参数\n",
    "    # 交叉验证集中所有样本的概率\n",
    "    pVal = np.mat([p(x.T) for x in XVal]).reshape(-1,1)  # 维度为：交叉验证集样本数*1\n",
    "    step = (np.max(pVal) - np.min(pVal)) / 1000.0\n",
    "    \n",
    "    bestEpsilon = 0\n",
    "    bestF1 = 0\n",
    "    \n",
    "    for epsilon in np.arange(np.min(pVal), np.max(pVal), step):\n",
    "        predictions = pVal < epsilon\n",
    "        f1 = F1(predictions, yVal)\n",
    "        if f1 > bestF1:\n",
    "            bestF1 = f1\n",
    "            bestEpsilon = epsilon\n",
    "    return bestEpsilon, bestF1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.io import loadmat\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "基于交叉验证集最佳ε: 8.990853e-05\n",
      "\n",
      "基于交叉验证集最佳F1:  0.875000\n",
      "\n",
      "找到 6 个异常点\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x24c7024b6d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 低维数据测试\n",
    "data = loadmat('data/ex8data1.mat')\n",
    "X = np.mat(data['X'])\n",
    "XVal = np.mat(data['Xval'])\n",
    "yVal = np.mat(data['yval'])\n",
    "\n",
    "p = train(X)\n",
    "#p = train(X, model=multivariateGaussianModel)\n",
    "pTest = np.mat([p(x.T) for x in X]).reshape(-1, 1)\n",
    "\n",
    "# 绘制数据点\n",
    "plt.xlabel(u'延迟 (ms)')\n",
    "plt.ylabel(u'吞吐 (mb/s)')\n",
    "plt.plot(X[:, 0], X[:, 1], 'bx')\n",
    "epsilon, f1 = selectEpsilon(XVal, yVal, p)\n",
    "\n",
    "print('基于交叉验证集最佳ε: %e\\n'%epsilon)\n",
    "print('基于交叉验证集最佳F1:  %f\\n'%f1)\n",
    "print('找到 %d 个异常点' % np.sum(pTest < epsilon))\n",
    "\n",
    "# 获得训练集的异常点\n",
    "outliers = np.where(pTest < epsilon, True, False).ravel()\n",
    "plt.plot(X[outliers, 0], X[outliers, 1], 'ro', lw=2, markersize=10, fillstyle='none', markeredgewidth=1)\n",
    "n = np.linspace(0, 35, 100)\n",
    "X1 = np.meshgrid(n,n)\n",
    "XFit = np.mat(np.column_stack((X1[0].T.flatten(), X1[1].T.flatten())))\n",
    "pFit = np.mat([p(x.T) for x in XFit]).reshape(-1, 1)\n",
    "pFit = pFit.reshape(X1[0].shape)\n",
    "\n",
    "if not np.isinf(np.sum(pFit)):\n",
    "    plt.contour(X1[0], X1[1], pFit, 10.0**np.arange(-20, 0, 3).T)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best epsilon found using cross-validation: 1.377229e-18\n",
      "\n",
      "Best F1 on Cross Validation Set:  0.615385\n",
      "\n",
      "# Outliers found: 117\n"
     ]
    }
   ],
   "source": [
    "# 高维数据\n",
    "data = loadmat('data/ex8data2.mat')\n",
    "X = np.mat(data['X'])\n",
    "XVal = np.mat(data['Xval'])\n",
    "yVal = np.mat(data['yval'])\n",
    "\n",
    "p = train(X)\n",
    "#p = train(X, model=multivariateGaussianModel)\n",
    "pTest = np.mat([p(x.T) for x in X]).reshape(-1, 1)\n",
    "\n",
    "epsilon, f1 = selectEpsilon(XVal, yVal, p)\n",
    "\n",
    "print('Best epsilon found using cross-validation: %e\\n'%epsilon)\n",
    "print('Best F1 on Cross Validation Set:  %f\\n'%f1)\n",
    "print( '# Outliers found: %d' % np.sum(pTest < epsilon))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
